package DP;

/**
 * 152.乘积最大子数组
 * 给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续 子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。
 * 测试用例的答案是一个 32-位 整数。
 */
public class maxProduct {
    public int maxProduct(int[] nums) {
        int res = nums[0];
        int maxProd = nums[0];
        int minProd = nums[0];

        // 从第二个数开始遍历
        for (int i = 1; i < nums.length; i++) {
            int num = nums[i];

            // 当遇到负数时，交换maxProd和minProd
            if (num < 0) {
                int temp = maxProd;
                maxProd = minProd;
                minProd = temp;
            }

            // 计算以当前数结尾的最大和最小乘积
            maxProd = Math.max(num, maxProd * num);
            minProd = Math.min(num, minProd * num);

            // 更新结果
            res = Math.max(res, maxProd);
        }

        return res;
    }

    public static void main(String[] args) {
        maxProduct m = new maxProduct();
        // 测试用例：包含0和负数的情况
        System.out.println(m.maxProduct(new int[]{1, 0, -1, 2, 3, -5, -2}));
    }
}